/*
 * adxl345.c
 *
 *  Created on: Aug 28, 2013
 *      Author: IEUser
 */


/******************************************************************************************
 *	Deklaracje dołączanych plików nagłówkowych i bibliotek								 *
 *****************************************************************************************/
#include "adxl345.h"

/******************************************************************************************
 *	Deklaracje zmiennych globalnych								                         *
 *****************************************************************************************/

/******************************************************************************************
 *	Deklaracje funkcji															 		 *
 *****************************************************************************************/

/*
 * 	Funkcja zapisu bajtu do ADXL345
 * 	Argument: 	address - adres komórki pamięci ADXL345,
 * 				byte - bajt danych
 */
void adxl345_write_byte(uint8_t address, uint8_t byte){
    twi_start();
	twi_write_byte(ADXL345);
	twi_write_byte(address);
	twi_write_byte(byte);
    //twi_stop();
}/* adxl345_write_byte */

/*
 * 	Funkcja odczytu bajtu z komórki pamięci ADXL345
 * 	Argument: address - adres komórki pamięci ADXL345
 *	Wynik: bajt danych z wybranej komórki pamięci
 */
uint8_t adxl345_read_byte(uint8_t address, uint8_t ack){
	uint8_t temp = 0;

	twi_start();
	twi_write_byte(ADXL345);
	twi_write_byte(address);
	twi_start();
	twi_write_byte(ADXL345 + 1);
	temp = twi_read_byte(ack);
	twi_stop();

	return temp;
}/* adxl345_read_byte */

/*
 * 	Funkcja konfigurujaca modul ADXL345
 * 	Argument: 	mode - tryb pracy {MEASURE, STANDBY}
 * 				range - czulosc modulu {RANGE_2G ... RANGE_16G}
 *	Wynik: bajt danych z wybranej komórki pamięci
 */
void adxl345_config(uint8_t mode, uint8_t range){
    uint8_t reg = 0;

    reg = adxl345_read_byte(DATA_FORMAT, NOACK);	// odczyt ustawienia danych
    reg = range | 0x03;						// zmiana zamaskowanych bitow zakresu pomiaru
	adxl345_write_byte(DATA_FORMAT, reg);	// zapis nowej wartosci do rejestru

    reg = adxl345_read_byte(POWER_CTL, NOACK);
    reg = mode | 0x08;
	adxl345_write_byte(POWER_CTL, reg);
}/* adxl345_config */

/*
 * 	Funkcja pobierania danych z ADXL345
 * 	Argument: x, y, z - wartosci przspieszen
 */
void adxl345_get_data(uint16_t *x, uint16_t *y, uint16_t *z){
	uint8_t data[6];

	for(uint8_t i=0; i<6; i++){
		data[i] = adxl345_read_byte(DATAX0+i, NOACK);
	}

	*x = (data[1]<<8) | data[0];
	*y = (data[3]<<8) | data[2];
	*z = (data[5]<<8) | data[4];

}/* pcf8583_get_time */


/******************************************************************************************
 *	Koniec pliku adxl345.c
 *****************************************************************************************/
